package com.itany.corejava.code09_异常;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author MissChen
 * @date 2024年03月07日 9:56
 */
public class Test02_异常处理 {
    public static void main(String[] args) throws Exception {
        // test01();

        // test02("2020/09/08");

        test03(10,0);


    }

    /**
     * 使用try-catch-finally语句处理异常
     */
    public static void test01() {
        try {// 可能出现异常的代码
            System.out.println("可能出现异常的代码");
            int i = 1 / 0;
            // int i=1/2;
            System.out.println("哈哈哈");

        } catch (ArithmeticException e) {//捕获异常
            // 当捕获到指定异常之后进行处理的代码
            System.out.println("出现异常了");
            System.out.println(e);
            // System.out.println("异常信息:"+e.getMessage());

            //打印堆栈中详细信息
            // e.printStackTrace();
        } finally {// 无论是否出现异常都必须要执行的代码
            System.out.println("我都会执行");
        }

        System.out.println("嘻嘻嘻");
    }

    /**
     * 使用throws处理异常，使用throws声明抛出异常
     * @param s
     * @throws ParseException 当存在多个异常的时候，需要使用逗号将异常隔开
     */
    public static void test02(String s) throws ParseException, ClassNotFoundException {
        //方式一：通过catch捕获指定的异常
        // try {
        //     Date date = new SimpleDateFormat("yyyy-MM-dd").parse(s);
        // } catch (ParseException e) {
        //     System.out.println(e);
        //     System.out.println("解析失败"+s+"字符串格式有误");
        // }

        //方式二：通过catch捕获指定的异常，捕获到指定的异常后，然后抛出去
        try {
            Date date = new SimpleDateFormat("yyyy-MM-dd").parse(s);
        } catch (ParseException e) {

            //在catch中可以进行处理，也可以通过throw 关键字将异常进行抛出，不进行处理
            // throw后面跟的是异常对象，也可以通过new XXX()创建对应的异常对象
            // 也可以捕获当前的异常对象
            //当此处抛出异常对象后，方法的声明中必须添加throws
            throw e;
        }

        //方式三:直接使用throws声明抛出异常，不进行捕
        Class.forName("com.itany.hello");

    }
    public static int test03(int a,int b) throws Exception {
        if(b==0){
            //只有b的值为0的时候有异常
            // 此时可以不用try-catch
            //对于运行时异常，方法不需要通过throws声明的，此时方法没有throws
            // ArithmeticException e=new ArithmeticException("第二个参数不能为0，否则除数为0");
            // throw e;
            // System.out.println("111");
            // throw相当于return，表示代码结束

            //对于检查异常，方法必须声明
            throw new Exception("这是检查异常");


        }
        return a/b;
    }


}




